package cn.tedu.micro.demo.rabbit.config;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmCallback;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.io.IOException;

/**
 * 默认当前容器启动,存在一个rabbitTemplate
 * 但是不满足我们要求 我们需要手动确认 发送需要回调监听成功失败
 */
//@Configuration
@Slf4j
public class RabbitConfiguration {
    /**
     * 自定义组织一个rabbitTemplate
     * ConnectionFactory 底层框架自动装配的一个 使用yaml属性创建的连接工厂
     */
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory);
        //自定义template中的发送确认回调 成功 失败
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            //消息发送结果 有rabbitmq反馈时,会被调用confirm
            /**
             * @param correlationData  消息的唯一标识 理解成消息tag 可以在业务中自定义
             * @param ack true 成功发送, false 失败发送
             * @param cause 如果失败 可能携带失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack){
                    log.info("消息发送成功:{}",correlationData);
                }else{
                    log.info("消息发送失败:{}",cause);
                    //一般失败,都会将数据传递给监控系统--普罗米修斯
                }
            }
        });
        return null;
    }
}
